package com.mercury.design.template.abst;


import lombok.*;
import lombok.extern.slf4j.Slf4j;


/**
 * 模板工厂
 * 工人的超类
 * <p>
 * 模板方法模式中的三类角色
 * 1、具体方法(Concrete Method)
 * 2、抽象方法(Abstract Method)
 * 3、钩子方法(Hook Method)
 * <p>
 * 三类角色的关联
 * 在模板方法模式中，首先父类会定义一个算法的框架，即实现算法所必须的所有方法。
 * <p>
 * 其中，具有共性的代码放在父类的具体方法中。
 * <p>
 * 各个子类特殊性的代码放在子类的具体方法中。但是父类中需要有对应抽象方法声明。
 * 钩子方法可以让子类决定是否对算法的不同点进行挂钩。
 *
 * @author mercury
 */

@Slf4j
@Setter
@Getter
public abstract class AbstractHandler {


    /**
     * 具体方法
     */
    public final void workOneDay() {
        log.info("workOneDay-----------------work start----------------");
        if (isNeedPrintDate()) {
            //是否开启模板
            return;
        }

        work();
        log.info("workOneDay-----------------work end----------------");
    }

    /**
     * 工作  抽象方法
     */
    public abstract void work();

    /**
     * 钩子方法
     */
    public boolean isNeedPrintDate() {
        return false;
    }


}
